home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / book / src / mouse.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  4KB  |  178 lines

  1. /*
  2.  *
  3.  *  マウス・パッド関連の下位ルーチン群
  4.  *
  5. */
  6.  
  7. #include    <stdio.h>
  8. #include    <egb.h>
  9. #include    <mos.h>
  10. #include    "book.h"
  11. #include    "mouse.h"
  12.  
  13. #include    "moscsr.def"
  14.  
  15.  
  16. /*
  17.  *  モノクロパターンとして保持しているマウスカーソルパターンを
  18.  *  16色に変換し、カラーマウスカーソルとして使えるようにする
  19. */
  20. void    mos_ptn_init( void )
  21. {
  22.     int     pos, apos ;
  23.     int     i, j, k, l ;
  24.     MOS     *mp ;
  25.  
  26.     for( l = 0 ; l < 4 ; l ++ )
  27.     {
  28.         mp = &mosptn[l] ;
  29.  
  30.         pos = 0 ;
  31.         apos = mp->ysiz * mp->xsiz * 4 ;
  32.  
  33.         for( i = 0 ; i < mp->ysiz ; i ++ )
  34.         {
  35.             for( j = 0 ; j < mp->xsiz ; j ++ )
  36.             {
  37.                 mp->ptn[apos] = 0 ;
  38.                 for( k = 0 ; k < 4 ; k ++ )
  39.                 {
  40.                     mp->ptn[apos] |= 
  41.                         ( ( (mp->ptn[pos+k] & 0xF0) == 0 ? 1:0 ) |
  42.                           ( (mp->ptn[pos+k] & 0x0F) == 0 ? 2:0 ) )
  43.                         << ( (3-k)*2 ) ;
  44.                 }
  45.                 apos ++ ;
  46.                 pos += 4 ;
  47.             }
  48.         }
  49.     }
  50. }
  51.  
  52.  
  53.  
  54. /*
  55.  *  マウスカーソルのパターンを切り換える
  56.  *  ただし、同じパターンに切り換え動作をするとカーソルがちらつくので、
  57.  *  その場合は処理をはしょる
  58. */
  59. static  int     mos_csr_ptn = -1 ;      /*  マウス・カーソルの番号  */
  60.  
  61. int     get_mos_ptn( void ) /*  現在のカーソルパータンを返す  */
  62. {
  63.     return mos_csr_ptn ;
  64. }
  65. void    set_mos_ptn( int num )  /*  強制的にパターンを切り換える  */
  66. {
  67.     MOS     *mp = &mosptn[ num ] ;
  68.  
  69.     MOS_type( 2, mp->x, mp->y, &mp->xsiz ) ;
  70.     mos_csr_ptn = num ;
  71. }
  72. void    mos_ptn( int num )  /*  マウス・カーソルの切り換え  */
  73. {
  74.     if( get_mos_ptn() != num )
  75.         set_mos_ptn( num ) ;
  76. }
  77.  
  78.  
  79.  
  80.  
  81. /*
  82.  *  現在のマウスカーソル位置を退避/復元する
  83.  *
  84.  *  backup == TRUE ならば退避、FALSEならば復元
  85. */
  86. void    mos_backup( int backup )
  87. {
  88.     static  int     sw, x, y ;
  89.  
  90.     if( backup )
  91.         MOS_rdpos( &sw, &x, &y ) ;
  92.     else
  93.         MOS_setpos( x, y ) ;
  94. }
  95.  
  96. /*
  97.  *  MOS_disp() 制御を無効にする
  98. */
  99. void    mos_dispoff( int flag )
  100. {
  101.     static  short   control[16] ;
  102.     static  short   num = 0 ;
  103.  
  104.     if( flag )      /*  MOS_disp() を無効にする  */
  105.     {
  106.         control[num] = MOS_getControl() ;
  107.         MOS_setControl( control[num] & 0xFFFE ) ;
  108.         if( ++num > 15 ) num = 15 ;
  109.     }
  110.     else            /*  MOS_disp() を復帰する  */
  111.     {
  112.         if( --num < 0 ) num = 0 ;
  113.         MOS_setControl( control[num] ) ;
  114.     }
  115. }
  116.  
  117.  
  118.  
  119. /*  マウスとパッドを区別せず扱う位置情報取得ルーチン  */
  120.  
  121. #if JOYPAD==USE_JOYPAD
  122. # define padU(x) ( ((x) & 0x01) == 0 ? TRUE : FALSE )
  123. # define padD(x) ( ((x) & 0x02) == 0 ? TRUE : FALSE )
  124. # define padL(x) ( ((x) & 0x04) == 0 ? TRUE : FALSE )
  125. # define padR(x) ( ((x) & 0x08) == 0 ? TRUE : FALSE )
  126. # define padA(x) ( ((x) & 0x10) == 0 ? TRUE : FALSE )
  127. # define padB(x) ( ((x) & 0x20) == 0 ? TRUE : FALSE )
  128. #endif
  129.  
  130. void    mos_rdpos( int *p_sw, int *p_x, int *p_y )
  131. {
  132. #if JOYPAD==USE_JOYPAD
  133.     static  int     pad_num = 0 ;
  134.     static  int     count = 0 ;
  135.     auto    int     pad, dt, dx, dy ;
  136. #endif
  137.     auto    int     sw, x, y ;
  138.  
  139.     /*  マウスカーソルの位置を読み込む  */
  140.     MOS_rdpos( &sw, &x, &y ) ;
  141.  
  142. #if JOYPAD==USE_JOYPAD
  143.     /*  パッドによる制御  */
  144.     SND_joy_in_1( 0, &pad ) ;
  145.  
  146.     if( 0x3F != pad )       /*  どれかON  */
  147.     {
  148.         sw = ( padB( pad ) ? 2 : 0 ) | ( padA( pad ) ? 1 : 0 ) ;
  149.  
  150.         if( count ++ >= 10 )
  151.         {
  152.             count = 0 ;
  153.  
  154.             if( ( dt = pad_num / 20 ) < 1 ) dt = 1 ;
  155.             if( dt > 10 )                   dt = 10 ;
  156.  
  157.             dx = dy = 0 ;
  158.  
  159.             if( !padL( pad ) || !padR( pad ) )
  160.                 dx = ( padL( pad ) ? (- dt) : ( padR( pad ) ? dt : 0 ) ) ;
  161.             if( !padU( pad ) || !padD( pad ) )
  162.                 dy = ( padU( pad ) ? (- dt) : ( padD( pad ) ? dt : 0 ) ) ;
  163.  
  164.             if( dx != 0 || dy != 0 )
  165.                 MOS_setpos( x += dx, y += dy ) ;
  166.             pad_num ++ ;
  167.         }
  168.     }
  169.     else
  170.         pad_num = 0 ;
  171. #endif
  172.  
  173.     if( p_sw != NULL )  *p_sw = sw ;
  174.     if( p_x  != NULL )  *p_x = x ;
  175.     if( p_x  != NULL )  *p_y = y ;
  176. }
  177.  
  178.